#ifndef KCHARTFORM_H
#define KCHARTFORM_H

#include <QWidget>
#include <QTimer>
#include <QVector>
#include <QDateTime>
#include <QRandomGenerator>

// K线数据结构
struct KlineData {
    QDateTime time;  // 时间
    double open;    // 开盘价
    double high;    // 最高价
    double low;     // 最低价
    double close;   // 收盘价
    double volume;  // 成交量
};
namespace Ui {
class KChartForm;
}

class KChartForm : public QWidget
{
    Q_OBJECT

public:
    explicit KChartForm(QWidget *parent = nullptr);
    ~KChartForm();

protected:
    // 重写绘图事件
    void paintEvent(QPaintEvent *event) override;
    // 鼠标移动事件，用于显示提示信息
    void mouseMoveEvent(QMouseEvent *event) override;
    // 调整窗口大小事件
    void resizeEvent(QResizeEvent *event) override;


private slots:
    // 生成新的K线数据
    void generateNewKlineData();
    // 启动/停止实时更新
    void on_startStopBtn_clicked();
    // 清除所有数据
    void on_clearBtn_clicked();
private:
    Ui::KChartForm *ui;

    QVector<KlineData> m_klineData;  // 存储K线数据
    QTimer *m_timer;                 // 定时器，用于实时更新
    bool m_isRunning;                // 是否正在运行

    // 绘图相关参数
    int m_marginLeft;    // 左 margin
    int m_marginRight;   // 右 margin
    int m_marginTop;     // 上 margin
    int m_marginBottom;  // 下 margin
    int m_candleWidth;   // K线宽度
    int m_candleSpace;   // K线间距

    // 当前鼠标指向的K线索引
    int m_hoveredIndex;

    // 计算绘图区域
    QRectF getChartRect() const;
    // 将价格值转换为Y坐标
    double priceToY(double price, const QRectF &rect) const;
    // 将时间转换为X坐标
    double timeToX(int index, const QRectF &rect) const;
    // 找到鼠标位置对应的K线索引
    int findKlineIndex(const QPoint &pos);
    // 生成随机价格数据
    double generateRandomPrice(double lastPrice);
};

#endif // KCHARTFORM_H
